package com.tennis.tennisreservation.service;

import com.tennis.tennisreservation.entity.Order;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

import org.springframework.data.domain.Page;

/**
 * 订单服务接口
 * 定义订单相关的业务逻辑
 */
public interface OrderService {
    
    /**
     * 创建预约订单
     * @param order 订单信息
     * @return 创建成功的订单
     */
    Order createOrder(Order order);
    
    /**
     * 更新订单信息
     * @param order 订单信息
     * @return 更新后的订单
     */
    Order updateOrder(Order order);
    
    /**
     * 取消订单
     * @param id 订单ID
     * @return 是否取消成功
     */
    boolean cancelOrder(Long id);
    
    /**
     * 根据ID查询订单详情
     * @param id 订单ID
     * @return 订单详情
     */
    Order getOrderById(Long id);
    
    /**
     * 根据用户ID查询订单列表
     * @param userId 用户ID
     * @return 订单列表
     */
    List<Order> getOrdersByUserId(Long userId);
    
    /**
     * 分页查询订单列表
     * @param page 页码
     * @param size 每页大小
     * @param userId 用户ID (可选)
     * @param keyword 关键词 (可选)
     * @param payStatus 支付状态 (可选)
     * @param status 订单状态 (可选)
     * @param startDate 开始日期 (可选)
     * @param endDate 结束日期 (可选)
     * @return 分页订单列表
     */
    Map<String, Object> getOrderList(int page, int size, Long userId, String keyword, 
                                      String payStatus, String status, LocalDateTime startDate, LocalDateTime endDate);
    
    /**
     * 更新订单支付状态
     * @param id 订单ID
     * @param payStatus 支付状态
     * @return 更新后的订单
     */
    Order updatePayStatus(Long id, String payStatus);
    
    /**
     * 更新订单支付状态并处理红包使用
     * @param id 订单ID
     * @param payStatus 支付状态
     * @param couponId 红包ID（如果有）
     * @return 更新后的订单
     */
    Order updatePayStatusWithCoupon(Long id, String payStatus, Long couponId);
    
    /**
     * 检查时间冲突
     * @param courtId 场地ID
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 是否存在冲突
     */
    boolean checkTimeConflict(Long courtId, LocalDateTime startTime, LocalDateTime endTime);
    
    /**
     * 根据日期查询订单列表
     * @param date 日期
     * @return 订单列表
     */
    List<Order> getOrdersByDate(LocalDate date);
    
    /**
     * 根据订单状态查询订单列表
     * @param status 订单状态
     * @return 订单列表
     */
    List<Order> getOrdersByStatus(String status);
    
    /**
     * 根据用户ID和订单状态查询订单列表
     * @param userId 用户ID
     * @param status 订单状态
     * @return 订单列表
     */
    List<Order> getOrdersByUserIdAndStatus(Long userId, String status);
    
    /**
     * 标记订单为已使用状态
     * @param id 订单ID
     * @return 操作是否成功
     */
    boolean markOrderAsUsed(Long id);
    
    /**
     * 清理过期订单
     * 自动处理时间已过但未标记状态的订单
     * @return 清理的订单数量
     */
    int cleanExpiredOrders();
    
    /**
     * 处理余额支付
     * 更新订单状态为已支付，并更新用户余额
     * @param orderId 订单ID
     * @param userId 用户ID
     * @param giftBalance 更新后的赠送余额
     * @param rechargeBalance 更新后的充值余额
     * @param couponId 红包ID(可选)
     * @return 处理结果
     */
    boolean processBalancePayment(Long orderId, Long userId, String giftBalance, 
        String rechargeBalance, Long couponId);
} 